import axios from 'axios';
import router from '@/router/index';

// 创建 axios 对象
const service = axios.create({
    baseURL: process.env.VUE_APP_BASE_URL + '/index.php/api/' || '', // 根路径
    retry: 4,
    timeout: 100000 // 网络延时
})

service.defaults.withCredentials = true;

// 添加请求拦截器 => 前端给后端的参数【还没到后端响应】
service.interceptors.request.use((config) => {
    // 在发送请求之前做些什么
    config.headers = {
        'Content-Type': 'application/json', // 配置请求头
    };
    let token = localStorage.getItem('token') || ''
    if (config.method == 'get') {
        if (config.params) {
            config.params['app_id'] = 10001;
            if (token) {
                config.params['token'] = token;
            }
        } else {
            config.params = { 'app_id': 10001, 'token': '' }
            if (token) {
                config.params.token = token
            }
        }
    } else {
        if (config.data ) {
            config.data['app_id'] = 10001;
            if (token) {
                config.data['token'] = token;
            }
        } else {
            config.data = { 'app_id': 10001, 'token': ''}
            if (token) {
                config.data.token = token
            }
        }
    }
    // 如有需要：注意使用token的时候需要引入cookie方法或者用本地localStorage等方法，推荐js-cookie
    if (token) {
        config.headers.token = `${token}`; // 如果要求携带在请求头中
    }

    return config;
}, (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器 => 后端给前端的数据【后端返回给前端的东西】
service.interceptors.response.use((response) => {
    // 对响应数据做点什么
    // 接收到响应数据并成功后的一些共有的处理，关闭loading等
    let res = response.data;

    // 如果是返回文件
    if (response.config.responseType === 'blob') {
        return res;
    }
    // 兼容服务器返回的字符串数据
    if (typeof res === 'string') {
        res = res ? JSON.parse(res) : res;
    }

    if (res.code === -1) {
        router.push('/login');
        localStorage.clear();
    } else {
        if (res.code == 530) {
            let config = response.config;

            // 记录重新请求次数
            config.__retryCount = config.__retryCount || 0;

            // 如果次数上线，直接返回
            if (config.__retryCount >= config.retry) {
                return "请求失败";
            }

            // 请求次数枚举 自增
            config.__retryCount += 1;

            var backoff = new Promise(function (resolve) {
                setTimeout(function () {
                    resolve();
                }, 1000);
            });

            return backoff.then(function () {
                return service(response.config);
            });
        }
    }

    return res;
}, (error) => {
    // 对响应错误做点什么
    // 接收到异常响应的处理开始
    if (error && error.response) {
        // 1.公共错误处理
        // 2.根据响应码具体处理
        switch (error.response.status) {
            case 400:
                error.message = '错误请求';
                break;
            case 401:
                error.message = '';
                break;
            case 403:
                error.message = '拒绝访问';
                break;
            case 404:
                error.message = '请求错误,未找到该资源';
                break;
            case 405:
                error.message = '请求方法未允许';
                break;
            case 408:
                error.message = '请求超时';
                break;
            case 500:
                error.message = '服务器端出错';
                break;
            case 501:
                error.message = '网络未实现';
                break;
            case 502:
                error.message = '网络错误';
                break;
            case 503:
                error.message = '服务不可用';
                break;
            case 504:
                error.message = '网络超时';
                break;
            case 505:
                error.message = 'http版本不支持该请求';
                break;
            default:
                error.message = `连接错误${error.response.status}`;
        }
    } else {
        // 超时处理
        if (JSON.stringify(error).includes('timeout')) {
            // Message.error('服务器响应超时，请刷新当前页')
            console.log('服务器响应超时，请刷新当前页');
        }
        error.message = '连接服务器失败';
    }

    if (error.message) {
        // Message.error(error.message);
    }

    return Promise.reject(error);
});

// 最终返回的对象
export default service
